Applogic — сервис сценариев поведения устройства

Applogic, сокращение от “Application Logic” — это сервис в составе встраиваемого ПО, предназначенный для гибкой настройки работы микроэлектронного прибора посредством пользовательских сценариев на языке скриптов Lua.

картинка

Правила

В зависимости от прикладной задачи оператор устройства или инженер-пусконаладчик имеет возможность настроить прибор на выполнение требуемой логики. Это реализуется с помощью правил, которые предписывают сервису Applogic тот или иной сценарий работы системы.

Быструю иллюстрацию сценариев можно показать на примере ПО беспроводного роутера, выполнив в консоли прибора командцуу applogic list:

root@OpenWrt:~# applogic list
root@OpenWrt:~# applogic list
"01_rule": "Правило переключения если нет Cим-карты в слоте
"02_rule": "Правило переключения Cим-карты при отсутствии регистрации в сети",
"03_rule": "Правило переключения Сим-карты, если баланс ниже минимума",
"04_rule": "Правило переключения Сим-карты при отсутствии PING сети",
"06_rule": "Мигание светодиода LED1 - уровень сигнала",
"14_rule": "Автоопределение провайдера",
"16_rule": "Правило для управления роутером по СМС.",
"19_rule": "Журналирование событий Микроконтроллера",
"20_rule": "Журналирование - статус интерфейса MODEM

Логические узлы

Правила состоят из логических узлов, которые обрабатываются последовательно — от первого до последнего. Узел - это простая таблица, содержащая операторы узла.

Простейший пример логического узла

----------------------------
-- Узел "N1_Signal_Strength"
----------------------------
-- Получить посредством шины UBUS значение
-- уровня сигнала от базовой станции GSM-оператора
----------------------------
N1_Signal_Strength = { -- Имя логического узла
 {
 ["load-ubus"] = function(nodes) -- Оператор узла, выполняющий запрос к системной шине
 return {
 ubus = "tsmodem.driver", -- Имя объекта на системной шине
 method = "signal", -- Вызываемый метод
 params = {}, -- без параметров
 }
 end
 },
{
-- следующий оператор узла
-- и т.д.
}
}

Операторы узла

Оператор узла — это типовая функция, предназначенная для решения одной узкоспециализированной задачи. Например, обращение к системной шине, обращение к периферийному устройству по заданному протоколу, передача вычисленных значений в интерфейс пользователя и т.п.

Базовый (предустановленный) набор операторов

Оператор Назначение
[load-ubus] Получает данные по системной шине UBUS Подробнее
[subscribe] Подписывает логический узел на событие системной шины Подробнее
[skip] Пропускает обработку следующих за ним операторов узла Подробнее
[frozen] Предназначен для задержки (заморозки) вычисленного в узле значения на заданное время Подробнее
[save] Сохраняет вычисленное значение узла для использования в следующей итерации обработки правил Подробнее
[timeout] Включает обратный отсчёт заданного количества секунд Подробнее
[websocket] Передаёт данные в веб-интерфейс (или панель индикации) Подробнее
[journal] Обеспечивает журналирование данных, вычисляемых в узлах правила Подробнее
[break] Прерывает выполнение текущего правила в зависимости от заданных условий Подробнее

Инженер-пусконаладчик также может написать собственный пользовательский оператор на языке скриптов Lua.

Общий синтаксис для всех операторов узла

-- [[ Пример узла с названием "N1_example_node", в котором последовательно выполняются ]]
-- [[ три оператора: ["load-ubus"], ["timeout"] и ["ui-update"]. ]]

N1_example_node = {
    {
        ["load-ubus"] = function(nodes)
            return {
                -- table of [load-ubus] operator's parameters
            }
        end
    },
    {
        ["timeout"] = function(nodes)
            return {
                -- table of [timeout] operator's parameters
            }
        end
    },
    {
        ["ui-update"] = function(nodes)
            return {
                -- table of [ui-update] operator's parameters
            }
        end
    }
}